/*
 * @Description: test
 * @Author: rendc
 * @Date: 2024-08-02 09:04:22
 * @LastEditors: rendc
 * @LastEditTime: 2024-08-02 10:07:16
 */
// 函数声明
// function 关键字
// add 函数名
// (a,b) 形参列表 形参列表可以为空
// {} 函数体
console.log('🤡 CC - add(2,3):', add(2, 3));
// return a+b; 返回值
function add (a, b) {
  // 函数体
  return a + b;
}
// 函数的调用
// add 函数名
// (1,2) 实参列表
// 函数调用要加()去执行
console.log('🤡 CC - add(1, 2):', add(1, 2));

// 函数表达式
// 匿名函数
var myAdd = function (a, b) {
  return a + b;
}
console.log('🤡 CC - myAdd(1, 2):', myAdd(1, 2));

// var声明的变量会提升(只有声明会提升，赋值不会提升)
console.log('🤡 CC - a:', a);// undefined
// console.log('🤡 CC - b:', b);// 报错  b is not defined
var a; // 声明变量 
console.log('🤡 CC - a:', a); // undefined
a = 123;// 变量初始化
console.log('🤡 CC - a:', a);// 123



// arguments
function add1 () {
  console.log('🤡 CC - add1 - arguments:', arguments);
}

// { '0': 1, '1': 2, '2': 'hello' }
add1(1, 2, 3);
add1(1, 2);

// this 指向
var person = {
  firstName: "LeBron",
  lastName: "James",
  id: 8888,
  fullName: function () {
    return this.firstName + " " + this.lastName;
  }
};

//1. 在对象⽅法中， this 指向调⽤它所在⽅法的对象。
console.log('🤡 CC - person.fullName():', person.fullName());

// 2. 如果单独使用this 则它指向全局对象。
console.log('🤡 CC - this:', this);
// 在浏览器中 这个全局对象就是 window
// 在node中，指向的是⼀个{}   global

// 3. 函数中使⽤ this（默认）
// 在函数中，函数的所属者默认绑定到 this 上

// 4. 事件中的 this
// 在 HTML 事件句柄中，this 指向了接收事件的 HTML 元素：

// 5. 使用apply 和 call改变this指向


// 立即执行函数
function hello () {
  console.log('🤡 CC - hello - hello');
}
hello();

(function hello1 () {
  console.log('🤡 CC - hello1 - hello1');
})();

var sum = (function (a, b) {
  return a + b;
}(1, 2))
console.log(sum);

var a = 10
function fn () {
  var b = 20
  function bar () {
    var c = a + b;
    console.log("a+b:", c) //30
  }
  return bar
}
var x = fn(), // 执⾏fn() 返回的是bar
  b = 200
x() //执⾏x，就是执⾏bar函数